For foreign parents, use the real parent not the root (which is what we list as paren...
authorAlexander Larsson <alexl@redhat.com>
Wed, 3 Dec 2008 21:00:56 +0000 (22:00 +0100)
committerAlexander Larsson <alex@localhost.localdomain>
Thu, 2 Apr 2009 08:14:05 +0000 (10:14 +0200)
gdk/gdkinternals.h
gdk/gdkwindow.c
gdk/x11/gdkwindow-x11.c

index b8fd252ca2bb1104e8112e313eb3672f5786d4a0..3a1c1c6ff030f1f2d8c5c0175a9869508080115e 100644 (file)
@@ -267,6 +267,7 @@ GdkPixmap *_gdk_bitmap_create_from_data  (GdkDrawable    *drawable,
                                           gint            height);
 
 void       _gdk_window_impl_new          (GdkWindow      *window,
+                                         GdkWindow      *real_parent,
                                          GdkScreen      *screen,
                                          GdkVisual      *visual,
                                          GdkEventMask    event_mask,
index fabe972e57983b52aa29b2efc6b54fa5292ff54d..0beba73a1c209642145514c83d77bda24a08a561 100644 (file)
@@ -636,6 +636,7 @@ gdk_window_new (GdkWindow     *parent,
   int x, y, depth;
   gboolean native;
   GdkEventMask event_mask;
+  GdkWindow *real_parent;
   
   g_return_val_if_fail (attributes != NULL, NULL);
   
@@ -661,6 +662,7 @@ gdk_window_new (GdkWindow     *parent,
   /* Windows with a foreign parent are treated as if they are children
    * of the root window, except for actual creation.
    */
+  real_parent = parent;
   if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
     parent = gdk_screen_get_root_window (screen);
 
@@ -783,7 +785,7 @@ gdk_window_new (GdkWindow     *parent,
        event_mask = GDK_EXPOSURE_MASK;
       
       /* Create the impl */
-      _gdk_window_impl_new (window, screen, visual, event_mask, attributes, attributes_mask);
+      _gdk_window_impl_new (window, real_parent, screen, visual, event_mask, attributes, attributes_mask);
     }
   else
     {
@@ -1019,9 +1021,9 @@ gdk_window_set_has_native (GdkWindow *window, gboolean has_native)
   GdkVisual *visual;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
-  g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
 
-  if (GDK_WINDOW_DESTROYED (window))
+  if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT ||
+      GDK_WINDOW_DESTROYED (window))
     return;
 
   private = (GdkWindowObject *) window;
@@ -1043,7 +1045,7 @@ gdk_window_set_has_native (GdkWindow *window, gboolean has_native)
       visual = gdk_drawable_get_visual (window);
 
       old_impl = private->impl;
-      _gdk_window_impl_new (window, screen, visual, GDK_EXPOSURE_MASK, NULL, 0);
+      _gdk_window_impl_new (window, private->parent, screen, visual, GDK_EXPOSURE_MASK, NULL, 0);
       new_impl = private->impl;
       
       private->impl = old_impl;
@@ -1482,6 +1484,11 @@ gdk_window_add_filter (GdkWindow     *window,
   private = (GdkWindowObject*) window;
   if (private && GDK_WINDOW_DESTROYED (window))
     return;
+
+  /* Filters are for the native events on the native window, so
+     ensure there is a native window. */
+  if (window)
+    gdk_window_set_has_native (window, TRUE);
   
   if (private)
     tmp_list = private->filters;
index b5a3a3aa84fbc1a30bdbeb31420b868bcd01a9b7..ed9a854a6ac843b8eb564e05a6a02abf18df0eb9 100644 (file)
@@ -624,6 +624,7 @@ setup_toplevel_window (GdkWindow *window,
 
 void
 _gdk_window_impl_new (GdkWindow     *window,
+                     GdkWindow     *real_parent,
                      GdkScreen     *screen,
                      GdkVisual     *visual,
                      GdkEventMask   event_mask,
@@ -652,7 +653,7 @@ _gdk_window_impl_new (GdkWindow     *window,
   private = (GdkWindowObject *) window;
   
   screen_x11 = GDK_SCREEN_X11 (screen);
-  xparent = GDK_WINDOW_XID (private->parent);
+  xparent = GDK_WINDOW_XID (real_parent);
   
   impl = g_object_new (_gdk_window_impl_get_type (), NULL);
   private->impl = (GdkDrawable *)impl;